package top.syfy.bili.fbm.util;

import top.syfy.bili.fbm.entry.BiliCacheVideo;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

/**
 * ffmpegUtil工具类
 *
 * @author awg
 * @date 2020/10/18 星期日
 */
public class FfmpegUtil {

    /**
     * 通过Java调用ffmpeg命令
     *
     * @param ffmpeg    ffmpeg命令可执行文件的所在路径
     * @param videoPart 缓存文件的视频文件的路径
     * @param audioPart 缓存文件的音频文件的路径
     * @param outFile   缓存文件的视频、音频合并后生成的文件
     */
    public static void ffmpegProcess(String ffmpeg, String videoPart, String audioPart, String outFile) throws IOException {
        if (Objects.isNull(ffmpeg) || Objects.isNull(videoPart) || Objects.isNull(audioPart) || Objects.isNull(outFile)) {
            return;
        }
        ProcessBuilder processBuilder = new ProcessBuilder();
        List<String> command = new ArrayList<>();
        /*
         * ffmpeg将音频和视频文件进行合并的命令(含参数)如下：
         * ffmpeg -i 视频文件名 -i 音频文件名 -c:v copy -strict experimental 输出文件名
         * ffmpeg -i 视频文件名 -i 音频文件名 -codec copy 输出文件名
         */
        command.add(ffmpeg);
        command.add("-i");
        command.add(videoPart);
        command.add("-i");
        command.add(audioPart);
        command.add("-codec");
        //command.add("-c:v");
        command.add("copy");
        //command.add("-strict");
        //command.add("experimental");
        command.add(outFile);
        processBuilder.command(command);
        processBuilder.redirectErrorStream(true);
        processBuilder.start();
    }

    /**
     * 调用FFmpeg命令将音频和视频文件进行合并
     *
     * @param ffmpeg    ffmpeg可执行文件的所在目录
     * @param videoList 缓存视频实例对象列表
     * @param outFile   合并后文件的存放目录
     * @throws IOException IO异常
     */
    public static void runFfmpeg(String ffmpeg, List<BiliCacheVideo> videoList, File outFile) throws IOException {
        File titleDir = new File(outFile, videoList.get(0).getTitle() + File.separator);
        if (!titleDir.exists()) {
            System.out.println(titleDir.mkdirs() ? "专辑目录创建成功" : "专辑目录创建失败");
        }
        for (BiliCacheVideo v : videoList) {
            FfmpegUtil.ffmpegProcess(
                    ffmpeg,
                    v.getVideoPart(),
                    v.getAudioPart(),
                    titleDir.getAbsolutePath() + File.separator + v.getIndex() + "-" + v.getIndexTitle() + ".mp4"
            );
        }
    }
}